import cv2
import numpy as np

"""
@Project: pythonPro1
@Name: _0work_tools.py
@Author: linxin_liu
@Date: 2022/10/14 18:36
"""


def cv_show(windows_name, image, time):  # over
    cv2.imshow(windows_name, image)  # 创建一个窗口，命名image，并展示窗口
    cv2.waitKey(time)  # 窗口显示时间，参数为0表示按任意键销毁
    cv2.destroyAllWindows()  # 销毁所有窗口


def box_filter_factor(box_size, elements_type_digit):  # over
    # 盒子生成器。
    if -1 < elements_type_digit < 256:
        # 返回元素为0~255的盒子。
        box_filter = [[i * 0 + elements_type_digit for j in range(box_size[0])] for i in range(box_size[1])]
    else:
        box_filter = [[i * 0 for j in range(box_size[0])] for i in range(box_size[1])]
    return box_filter  # 否则默认返回元素都为0的盒子。


def img_box_operate(img, box_filter):  # 传入原始图像。可用于拉普拉斯过滤器和sobel过滤器。
    full_imag = fulfill_border(img, 1, 1, 1, 1, 'black')  # 先将图片加大一圈，那一圈值为0。
    if len(box_filter) == 3 and len(box_filter[0]) == 3:  # 如果是3*3过滤器
        # 大一圈的图片和过滤器进行相关运算。
        for i in range(0, len(img)):
            for j in range(0, len(img[0])):
                counts = \
                    full_imag[i][j] * box_filter[0][0] + full_imag[i][j + 1] * box_filter[0][1] + full_imag[i][j + 2] * \
                    box_filter[0][2] + \
                    full_imag[i + 1][j] * box_filter[1][0] + full_imag[i + 1][j + 1] * box_filter[1][1] + full_imag[i + 1][
                        j + 2] * box_filter[1][2] + \
                    full_imag[i + 2][j] * box_filter[2][0] + full_imag[i + 2][j + 1] * box_filter[2][1] + full_imag[i + 2][
                        j + 2] * box_filter[2][2]
                img[i][j] = counts
    return img


def fulfill_border(img, top_s, bottom_s, left_s, right_s, border_type):  # over
    # 扩大图片
    h = len(img) + top_s + bottom_s  # 大图片的高
    w = len(img[0]) + left_s + right_s  # 大图片的宽
    array_temp = np.arange(0, h * w)
    img_temp = array_temp.reshape((h, w))  # 一维转二维 元素都为0
    # 先处理灰度图。
    if border_type == 'black':  # 添加的像素都为0
        img_temp[top_s:len(img_temp) - bottom_s, left_s:len(img_temp[0]) - right_s] = img[:, :]  # 原图赋值。
        img_temp[0:top_s, 0:len(img_temp[0])] = 0  # 前top_s行为0
        img_temp[len(img_temp) - bottom_s:len(img_temp), 0:len(img_temp[0])] = 0  # 后bottom_s行为0
        img_temp[0:len(img_temp), 0:left_s] = 0  # 前left_s列
        img_temp[0:len(img_temp), len(img_temp[0]) - right_s:len(img_temp[0])] = 0  # 后right_s列
    elif border_type == 'white':  # 添加的像素都为255
        img_temp[top_s:len(img_temp) - bottom_s, left_s:len(img_temp[0]) - right_s] = img[:, :]
        img_temp[0:top_s, 0:len(img_temp[0])] = 255
        img_temp[len(img_temp) - bottom_s:len(img_temp), 0:len(img_temp[0])] = 255
        img_temp[0:len(img_temp), 0:left_s] = 255
        img_temp[0:len(img_temp), len(img_temp[0]) - right_s:len(img_temp[0])] = 255
    else:
        pass
    return np.array(img_temp, dtype=np.uint8)  # 修改数据类型。


def img_merge(img_original, img_g, img_b, img_r):  # over
    # 三通道融合。
    # 将三通道直接赋值给原图像。
    img_original[:, :, 0] = img_g
    img_original[:, :, 1] = img_b
    img_original[:, :, 2] = img_r
    return img_original


def img_add(img_ori, img_g, img_b, img_r):  # over
    # 将三通道加给原图像。(直接加。)
    img_ori[:, :, 0] = img_g + img_ori[:, :, 0]
    img_ori[:, :, 1] = img_b + img_ori[:, :, 1]
    img_ori[:, :, 2] = img_r + img_ori[:, :, 2]
    return img_ori


def box_turn(box):  # over
    # 功能：盒子关于盒子中心翻转180度。
    # 生成一个和box一样大小的临时盒子，元素都为0，用来存放box翻转后的结果。
    box_temp = box_filter_factor([len(box), len(box[0])], 0)
    for i in range(0, len(box)):
        for j in range(0, len(box[0])):
            # 将box反向遍历给box_temp实现翻转。
            box_temp[i][j] = box[len(box)-i-1][len(box[0])-j-1]
    return box_temp


def bgr_to_rgb(img):
    out = img.copy()
    out[:, :, 0] = img[:, :, 2]
    out[:, :, 2] = img[:, :, 0]
    return out
